﻿using System;
using System.Collections.Generic;
using System.Linq;
using WebApp.Models;
using WebApp.ViewModels;

namespace WebApp.Extensions.Logic
{
    public static class BO_Tavoli
    {
        public static IEnumerable<EL_Tavolo> TAV_Get(this SET_Ordine set_ord_src, Guid sala)
        {
            var entities = new Entities();
            var l_oth = entities
                .REL_Ordine_Tavolo
                .Where(x => x.Ordine != set_ord_src.Guid)
                .Select(x => x.Tavolo);
            var l_tav = entities
                .ENT_Tavolo
                .Where(x => x.Sala == sala)
                .Select(x => x.Guid)
                .Except(l_oth);
            var l_sel = set_ord_src
                .REL_Ordine_Tavolo
                .Where(x => x.ENT_Tavolo.Sala == sala)
                .Select(x => x.Tavolo);
            var l_exc = l_tav
                .Except(l_sel)
                .ToList();
            var s_com = entities
                .ENT_Tavolo
                .Where(x => l_exc.Contains(x.Guid))
                .Select(x => new EL_Tavolo { Nome = x.Nome, Tavolo = x.Guid, Selezionato = false });
            return s_com
                .Union(entities
                    .ENT_Tavolo
                    .Where(x => l_sel.Contains(x.Guid))
                    .Select(x => new EL_Tavolo { Nome = x.Nome, Tavolo = x.Guid, Selezionato = true }))
                .OrderBy(x => x.Nome);
        }

        public static void TAV_Free(this SET_Ordine set_ord_src)
        {
            var entities = new Entities();
            foreach (var item in entities.REL_Ordine_Tavolo.Where(x => x.Ordine == set_ord_src.Guid))
            {
                entities.Entry(item).State = System.Data.EntityState.Deleted;
            }
            entities.SaveChanges();
        }

        public static void TAV_Del(this SET_Ordine set_ord_src, Guid tavolo)
        {
            var entities = new Entities();
            var item = entities.REL_Ordine_Tavolo.Where(x => x.Ordine == set_ord_src.Guid && x.Tavolo == tavolo).FirstOrDefault();
            if (item != null)
            {
                entities.Entry(item).State = System.Data.EntityState.Deleted;
                entities.SaveChanges();
                TAV_Update_Label(set_ord_src, entities);
            }
        }

        public static void TAV_Set(this SET_Ordine set_ord_src, Guid tavolo)
        {
            REL_Ordine_Tavolo item = new REL_Ordine_Tavolo();
            item.Guid = Guid.NewGuid();
            item.Tavolo = tavolo;
            item.Ordine = set_ord_src.Guid;
            var entities = new Entities();
            entities.REL_Ordine_Tavolo.Attach(item);
            entities.Entry(item).State = System.Data.EntityState.Added;
            entities.SaveChanges();
            TAV_Update_Label(set_ord_src, entities);
        }

        private static void TAV_Update_Label(SET_Ordine set_ord_src, Entities entities)
        {
            var items = entities.REL_Ordine_Tavolo.Where(x => x.Ordine == set_ord_src.Guid).OrderBy(x => x.ENT_Tavolo.Nome).Select(x => x.ENT_Tavolo.Nome).ToList();
            var set_ord = entities.SET_Ordine.Where(x => x.Guid == set_ord_src.Guid).Single();
            if (items.Any())
            {
                set_ord.Tavoli = items.Aggregate((a, x) => a + ";" + x);
            }
            else
            {
                set_ord.Tavoli = "-";
            }
            entities.Entry(set_ord).State = System.Data.EntityState.Modified;
            entities.SaveChanges();
        }

    }
}